package com.ccp.dev.workflow.model.bpm;

import com.ccp.dev.core.util.StringUtil;
import com.ccp.dev.workflow.model.NodeCache;
import com.ccp.dev.workflow.service.bpm.thread.TaskThreadService;
import org.flowable.common.engine.impl.interceptor.Command;
import org.flowable.common.engine.impl.interceptor.CommandContext;
import org.flowable.task.service.impl.persistence.entity.TaskEntity;
import org.flowable.task.service.impl.util.CommandContextUtil;


/**
 * 判断在审批过程中是否属于子流程的驳回。
 * <pre>
 * 1.判断是否为驳回指令。
 * 2.如果不是驳回动作，那么直接返回false。
 * 3.判断当前任务是否为子流程实例。
 * 4.如果是判断当前节点是否是子流程的第一个节点，如果是那么允许驳回。
 * </pre>
 *
 * @author ray
 */
public class AllowBackCallActivitiCmd implements Command<Boolean> {

    private String taskId = "";

    public AllowBackCallActivitiCmd(String taskId) {
        this.taskId = taskId;
    }

    @Override
    public Boolean execute(CommandContext context) {
        ProcessCmd cmd = TaskThreadService.getProcessCmd();
        if (cmd.isBack() != 1) {
            return false;
        }

        TaskEntity taskEntity = CommandContextUtil.getTaskEntityManager().findById(taskId);
        String id = taskEntity.getExecutionId();
        //   ExecutionEntityImpl entity = taskEntity.

        String superEntId = taskEntity.getExecutionId();
        //判断当前是否子流程实例。
        if (StringUtil.isEmpty(superEntId)) {
            return false;
        }
        //判断当前节点是否第一个节点。
        boolean rtn = false;
        try {
            rtn = NodeCache.isFirstNode(taskEntity.getProcessDefinitionId(), taskEntity.getEventHandlerId());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return rtn;
    }

}
